package ar.com.psicosoft.model.psicosoft;

import java.io.Serializable;

import javax.persistence.*;

import ar.com.psicosoft.model.psicosoft_datos_anexos.Localidad;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * The persistent class for the persona database table.
 * 
 */
@Entity
@Table(name = "persona", schema = "psicosoft")
@NamedQuery(name = "Persona.buscarPersonas", query = "SELECT p FROM Persona p")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Persona implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@SequenceGenerator(name = "sec_persona", sequenceName = "sec_persona", schema = "psicosoft", allocationSize = 1)
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sec_persona")
	@Column(name = "\"idPersona\"", unique = true, nullable = false, insertable = false, updatable = false)
	private Integer idPersona;

	@Column(name = "\"apellidoPersona\"", nullable = false, length = 35)
	private String apellidoPersona;

	@Column(name = "\"autorizacionAviso\"", length = 2147483647)
	private String autorizacionAviso;

	@Column(nullable = true)
	private Timestamp baja;

	@Column(nullable = false)
	private Timestamp creacion;

	@Column(name = "\"cuilCuit\"", length = 12)
	private String cuilCuit;

	@Column(length = 60)
	private String direccion;

	@Column(length = 20)
	private String dni;

	// @Column(nullable = false, length = 10)
	// private String dtype;

	@Column(nullable = false, length = 320)
	private String email;

	@Column(name = "\"fechaNacimiento\"", nullable = false)
	private Date fechaNacimiento;

	@Column(length = 50)
	private String foto;
	/*
	 * @Column(name = "\"idEstadoCivil\"", nullable = false) private Integer
	 * idEstadoCivil;
	 * 
	 * @Column(name = "\"idLocalidad\"", nullable = false) private Integer
	 * idLocalidad;
	 * 
	 * @Column(name = "\"idNivelEstudio\"", nullable = false) private Integer
	 * idNivelEstudio;
	 */
	@Column(name = "\"nombrePersona\"", nullable = false, length = 50)
	private String nombrePersona;

	@Column(nullable = false, length = 2147483647)
	private String sexo;

	@Column(length = 150)
	private String telefono;

	@Column(name = "\"tipoEntidad\"", length = 20)
	private String tipoEntidad;

	// bi-directional one-to-one association to Usuario
	// @OneToOne(fetch = FetchType.EAGER, mappedBy = "persona", targetEntity =
	// Usuario.class)
	// private Usuario usuario;

	// bi-directional one-to-one association to Cliente
	@OneToOne(fetch = FetchType.EAGER, mappedBy = "persona", targetEntity = Cliente.class)
	private Cliente cliente;

	// bi-directional many-to-one association to Paciente
	@OneToOne(fetch = FetchType.EAGER, mappedBy = "persona", targetEntity = Paciente.class)
	private Paciente paciente;

	// bi-directional many-to-one association to Factura
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "persona", targetEntity = Factura.class)
	private List<Factura> facturas = new ArrayList<Factura>();

	// uni-directional one-to-one association to Localidad
	@ManyToOne(fetch = FetchType.EAGER, targetEntity = Localidad.class)
	@JoinColumn(name = "\"idLocalidad\"", insertable = true, updatable = false)
	private Localidad localidad;

	// uni-directional many-to-one association to EstadoCivil
	@ManyToOne(fetch = FetchType.EAGER, targetEntity = EstadoCivil.class)
	@JoinColumn(name = "\"idEstadoCivil\"", insertable = true, updatable = false)
	private EstadoCivil estadoCivil;

	// uni-directional many-to-one association to NivelEstudio
	@ManyToOne(fetch = FetchType.EAGER, targetEntity = NivelEstudio.class)
	@JoinColumn(name = "\"idNivelEstudio\"", insertable = true, updatable = false)
	private NivelEstudio nivelEstudio;

	public Persona() {
	}

	/**
	 * @param nombrePersona
	 * @param apellidoPersona
	 * @param cuilCuit
	 * @param direccion
	 * @param dni
	 * @param email
	 * @param fechaNacimiento
	 * @param sexo
	 * @param idLocalidad
	 */
	public Persona(String nombrePersona, String apellidoPersona,
			String cuilCuit, String direccion, String dni, String email,
			Date fechaNacimiento, String sexo, EstadoCivil estadoCivil,
			NivelEstudio nivelEstudio, Localidad localidad, Timestamp creacion) {
		super();
		this.nombrePersona = nombrePersona;
		this.apellidoPersona = apellidoPersona;
		this.cuilCuit = cuilCuit;
		this.direccion = direccion;
		this.dni = dni;
		this.email = email;
		this.fechaNacimiento = fechaNacimiento;
		this.sexo = sexo;
		this.estadoCivil = estadoCivil;
		this.nivelEstudio = nivelEstudio;
		this.localidad = localidad;
		this.creacion = creacion;
	}

	public Integer getIdPersona() {
		return this.idPersona;
	}

	public void setIdPersona(Integer idPersona) {
		this.idPersona = idPersona;
	}

	public String getApellidoPersona() {
		return this.apellidoPersona;
	}

	public void setApellidoPersona(String apellidoPersona) {
		this.apellidoPersona = apellidoPersona;
	}

	public String getAutorizacionAviso() {
		return this.autorizacionAviso;
	}

	public void setAutorizacionAviso(String autorizacionAviso) {
		this.autorizacionAviso = autorizacionAviso;
	}

	public Timestamp getBaja() {
		return this.baja;
	}

	public void setBaja(Timestamp baja) {
		this.baja = baja;
	}

	public Timestamp getCreacion() {
		return this.creacion;
	}

	public void setCreacion(Timestamp creacion) {
		this.creacion = creacion;
	}

	public String getCuilCuit() {
		return this.cuilCuit;
	}

	public void setCuilCuit(String cuilCuit) {
		this.cuilCuit = cuilCuit;
	}

	public String getDireccion() {
		return this.direccion;
	}

	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}

	public String getDni() {
		return this.dni;
	}

	public void setDni(String dni) {
		this.dni = dni;
	}

	/*
	 * public String getDtype() { return this.dtype; }
	 * 
	 * public void setDtype(String dtype) { this.dtype = dtype; }
	 */
	public String getEmail() {
		return this.email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Date getFechaNacimiento() {
		return this.fechaNacimiento;
	}

	public void setFechaNacimiento(Date fechaNacimiento) {
		this.fechaNacimiento = fechaNacimiento;
	}

	public String getFoto() {
		return this.foto;
	}

	public void setFoto(String foto) {
		this.foto = foto;
	}

	public Localidad getLocalidad() {
		return this.localidad;
	}

	public void setLocalidad(Localidad localidad) {
		this.localidad = localidad;
	}

	/*
	 * public Integer getIdEstadoCivil() { return this.idEstadoCivil; }
	 * 
	 * public void setIdEstadoCivil(Integer idEstadoCivil) { // Agrego
	 * asignacion de Id this.setIdEstadoCivil(estadoCivil.getIdEstadoCivil());
	 * this.idEstadoCivil = idEstadoCivil; }
	 * 
	 * public Integer getIdLocalidad() { return this.idLocalidad; }
	 * 
	 * public void setIdLocalidad(Integer idLocalidad) { this.idLocalidad =
	 * idLocalidad; }
	 * 
	 * public Integer getIdNivelEstudio() { return this.idNivelEstudio; }
	 * 
	 * public void setIdNivelEstudio(Integer idNivelEstudio) {
	 * this.idNivelEstudio = idNivelEstudio; }
	 */

	public String getNombrePersona() {
		return this.nombrePersona;
	}

	public void setNombrePersona(String nombrePersona) {
		this.nombrePersona = nombrePersona;
	}

	public String getSexo() {
		return this.sexo;
	}

	public void setSexo(String sexo) {
		this.sexo = sexo;
	}

	public String getTelefono() {
		return this.telefono;
	}

	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}

	public String getTipoEntidad() {
		return this.tipoEntidad;
	}

	public void setTipoEntidad(String tipoEntidad) {
		this.tipoEntidad = tipoEntidad;
	}

	/*
	 * public Usuario getUsuario() { return this.usuario; }
	 * 
	 * public void setUsuario(Usuario usuario) { this.usuario = usuario; }
	 */

	public Cliente getCliente() {
		return this.cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public List<Factura> getFacturas() {
		return this.facturas;
	}

	public void setFacturas(List<Factura> facturas) {
		this.facturas = facturas;
	}

	public Factura addFactura(Factura factura) {
		getFacturas().add(factura);
		factura.setPersona(this);

		return factura;
	}

	public Factura removeFactura(Factura factura) {
		getFacturas().remove(factura);
		factura.setPersona(null);

		return factura;
	}

	public Paciente getPaciente() {
		return this.paciente;
	}

	public void setPaciente(Paciente paciente) {
		this.paciente = paciente;
	}

	public EstadoCivil getEstadoCivil() {
		return this.estadoCivil;
	}

	public void setEstadoCivil(EstadoCivil estadoCivil) {
		this.estadoCivil = estadoCivil;
	}

	public NivelEstudio getNivelEstudio() {
		return this.nivelEstudio;
	}

	public void setNivelEstudio(NivelEstudio nivelEstudio) {
		this.nivelEstudio = nivelEstudio;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((apellidoPersona == null) ? 0 : apellidoPersona.hashCode());
		result = prime * result + ((cliente == null) ? 0 : cliente.hashCode());
		result = prime * result
				+ ((cuilCuit == null) ? 0 : cuilCuit.hashCode());
		result = prime * result
				+ ((direccion == null) ? 0 : direccion.hashCode());
		result = prime * result + ((dni == null) ? 0 : dni.hashCode());
		result = prime * result + ((email == null) ? 0 : email.hashCode());
		result = prime * result
				+ ((fechaNacimiento == null) ? 0 : fechaNacimiento.hashCode());
		result = prime * result
				+ ((idPersona == null) ? 0 : idPersona.hashCode());
		result = prime * result
				+ ((nombrePersona == null) ? 0 : nombrePersona.hashCode());
		result = prime * result + ((sexo == null) ? 0 : sexo.hashCode());
		return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Persona other = (Persona) obj;
		if (apellidoPersona == null) {
			if (other.apellidoPersona != null)
				return false;
		} else if (!apellidoPersona.equals(other.apellidoPersona))
			return false;
		if (cliente == null) {
			if (other.cliente != null)
				return false;
		} else if (!cliente.equals(other.cliente))
			return false;
		if (cuilCuit == null) {
			if (other.cuilCuit != null)
				return false;
		} else if (!cuilCuit.equals(other.cuilCuit))
			return false;
		if (direccion == null) {
			if (other.direccion != null)
				return false;
		} else if (!direccion.equals(other.direccion))
			return false;
		if (dni == null) {
			if (other.dni != null)
				return false;
		} else if (!dni.equals(other.dni))
			return false;
		if (email == null) {
			if (other.email != null)
				return false;
		} else if (!email.equals(other.email))
			return false;
		if (fechaNacimiento == null) {
			if (other.fechaNacimiento != null)
				return false;
		} else if (!fechaNacimiento.equals(other.fechaNacimiento))
			return false;
		if (idPersona == null) {
			if (other.idPersona != null)
				return false;
		} else if (!idPersona.equals(other.idPersona))
			return false;
		if (nombrePersona == null) {
			if (other.nombrePersona != null)
				return false;
		} else if (!nombrePersona.equals(other.nombrePersona))
			return false;
		if (sexo == null) {
			if (other.sexo != null)
				return false;
		} else if (!sexo.equals(other.sexo))
			return false;
		return true;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Persona [idPersona="
				+ idPersona
				+ ", apellidoPersona="
				+ apellidoPersona
				+ ", autorizacionAviso="
				+ autorizacionAviso
				+ ", cuilCuit="
				+ cuilCuit
				+ ", direccion="
				+ direccion
				+ ", dni="
				+ dni
				+ ", email="
				+ email
				+ ", fechaNacimiento="
				+ fechaNacimiento
				+ ", foto="
				+ foto
				// + ", idEstadoCivil="
				// + idEstadoCivil + ", idLocalidad=" + idLocalidad
				// + ", localidad=" + localidad + ", idNivelEstudio="
				// + idNivelEstudio
				+ ", nombrePersona=" + nombrePersona + ", sexo=" + sexo
				+ ", telefono=" + telefono + ", tipoEntidad=" + tipoEntidad
				+ ", cliente=" + cliente + ", facturas=" + facturas
				+ ", estadoCivil=" + estadoCivil + ", nivelEstudio="
				+ nivelEstudio + ", getIdPersona()=" + getIdPersona()
				+ ", getApellidoPersona()=" + getApellidoPersona()
				+ ", getAutorizacionAviso()="
				+ getAutorizacionAviso()
				+ ", getBaja()="
				+ getBaja()
				+ ", getCuilCuit()="
				+ getCuilCuit()
				+ ", getDireccion()="
				+ getDireccion()
				+ ", getDni()="
				+ getDni()
				+ ", getEmail()="
				+ getEmail()
				+ ", getFechaNacimiento()="
				+ getFechaNacimiento()
				+ ", getFoto()="
				+ getFoto()
				+ ", getLocalidad()="
				+ getLocalidad()
				// + ", getIdLocalidad()=" + getIdLocalidad()
				// + ", getIdEstadoCivil()=" + getIdEstadoCivil()
				// + ", getIdNivelEstudio()=" + getIdNivelEstudio()
				+ ", getNombrePersona()=" + getNombrePersona() + ", getSexo()="
				+ getSexo() + ", getTelefono()=" + getTelefono()
				+ ", getTipoEntidad()=" + getTipoEntidad() + ", getCliente()="
				+ getCliente() + ", getFacturas()="
				+ getFacturas()
				// + ", getEstadoCivil()=" + getEstadoCivil()
				// + ", getNivelEstudio()=" + getNivelEstudio()
				+ ", hashCode()=" + hashCode() + ", getClass()=" + getClass()
				+ ", toString()=" + super.toString() + "]";
	}

}